/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.foxinline.manager.editar;

import br.com.foxinline.enums.TipoUnidade;
import br.com.foxinline.modelo.*;
import br.com.foxinline.servico.*;
import br.com.foxinline.utilitario.Msg;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import org.primefaces.event.map.MarkerDragEvent;
import org.primefaces.event.map.PointSelectEvent;
import org.primefaces.model.map.DefaultMapModel;
import org.primefaces.model.map.LatLng;
import org.primefaces.model.map.Marker;
import org.primefaces.model.map.Polygon;

/**
 *
 * @author ely
 */
@ManagedBean
@ViewScoped
public class ManagerEditarUnidade {

    @EJB
    UnidadeServico unidadeServico;
    @EJB
    EnderecoServico enderecoServico;
    @EJB
    BairroServico bairroServico;
    
    private Unidade unidadeEditar;
    private Unidade unidadeVisualizar;
    private Area area;
    private List<Coordenada> coordenadas;
    private Coordenada coordenada;
    private Polygon polygon;
    private LatLng coord = null;
    private DefaultMapModel mapModel;
    private boolean disableEnderecoImovel;
    private boolean mensagemCep;
    private String editarUnidade;
    private String visualizarUnidade;

    @PostConstruct
    public void init() {


        mensagemCep = false;
        disableEnderecoImovel = true;

        Map<String, String> params = FacesContext.getCurrentInstance().getExternalContext().getRequestParameterMap();
        editarUnidade = params.get("editarUnidade");
        visualizarUnidade = params.get("visualizarUnidade");
        polygon = new Polygon();
        paramPost();
        if (coordenadas != null) {
            plotar();
        }

    }

    public void plotar() {
        mapModel = new DefaultMapModel();
        LatLng coord;
        Polygon polygon = new Polygon();
        if (!coordenadas.isEmpty()) {
            for (Coordenada c : coordenadas) {
                coord = new LatLng(c.getLat(), c.getLng());
                mapModel.addOverlay(new Marker(coord, ""));
                polygon.getPaths().add(coord);
                polygon.setStrokeColor("#FF9900");
                polygon.setFillColor("#FF9900");
                polygon.setFillOpacity(0.2);
                mapModel.addOverlay(polygon);
            }
        }

        for (Marker premarker : mapModel.getMarkers()) {
            premarker.setDraggable(true);
        }
    }

    public void paramPost() {
        try {
            if (editarUnidade != null) {
                unidadeEditar = unidadeServico.pesquisar(Long.parseLong(editarUnidade));
                coordenadas = unidadeServico.lstCoordenada(unidadeEditar);
                area = unidadeEditar.getArea();
                if (unidadeEditar.getEndereco() == null) {
                    unidadeEditar.setEndereco(new Endereco());
                }
            }
            if (visualizarUnidade != null) {
                unidadeVisualizar = unidadeServico.pesquisar(Long.parseLong(visualizarUnidade));
                coordenadas = unidadeServico.lstCoordenada(unidadeVisualizar);
                area = unidadeVisualizar.getArea();
                 
            }

        } catch (Exception erro) {
            erro.printStackTrace();
        }
    }

    public void atualizar() {
        try {
            coordenadas = new ArrayList<Coordenada>();
            Bairro bairro;
            for (Marker marker : mapModel.getMarkers()) {
                coordenada = new Coordenada();
                coordenada.setLat(marker.getLatlng().getLat());
                coordenada.setLng(marker.getLatlng().getLng());
                coordenadas.add(coordenada);
            }

            area.setCoordenadas(coordenadas);
            unidadeEditar.setArea(area);

            bairro = bairroServico.findBairro(unidadeEditar.getEndereco().getBairro().getNome());
            if (bairro.getId() == null) {
                bairroServico.salvar(unidadeEditar.getEndereco().getBairro());
                unidadeEditar.getEndereco().setBairro(bairro);
            } else {
                unidadeEditar.getEndereco().setBairro(bairro);
            }

            unidadeServico.atualizar(unidadeEditar);
            Msg.messagemInfo(Msg.SuccessFull);

        } catch (Exception erro) {
        }
    }

    public void existeEndereco() {
        Endereco endereco;

        endereco = enderecoServico.existCep(unidadeEditar.getEndereco());

        if (endereco != null) {
            unidadeEditar.setEndereco(endereco);
            disableEnderecoImovel = true;
            mensagemCep = false;
        } else {
            mensagemCep = true;
            disableEnderecoImovel = false;
        }

    }

    public List<SelectItem> tipoUnidade() {
        List<SelectItem> items = new ArrayList<SelectItem>();
        for (TipoUnidade tipo : TipoUnidade.values()) {
            items.add(new SelectItem(tipo, tipo.getNome()));
        }
        return items;
    }

    public void handlePointClick(PointSelectEvent event) {
        LatLng latLng = event.getLatLng();

        addOverlayToMapModel(new Marker(latLng, ""));

        mapModel.addOverlay(polygon);

        for (Marker premarker : mapModel.getMarkers()) {
            premarker.setDraggable(true);
        }
    }

    public void onMarkerDrag(MarkerDragEvent event) {
        Marker marker = event.getMarker();

        for (Marker marker1 : mapModel.getMarkers()) {
            if (marker.getId().equals(marker1.getId())) {
                marker1.setLatlng(marker.getLatlng());
                break;
            }
        }
        polygon = new Polygon();

        List<Marker> markers = mapModel.getMarkers();
        mapModel = new DefaultMapModel();

        for (Marker m : markers) {
            addOverlayToMapModel(m);
        }
        mapModel.addOverlay(polygon);

        for (Marker premarker : mapModel.getMarkers()) {
            premarker.setDraggable(true);
        }
    }

    private void addOverlayToMapModel(Marker marker) {
        mapModel.addOverlay(marker);
        polygon.getPaths().add(marker.getLatlng());
        polygon.setStrokeColor("#FF9900");
        polygon.setFillColor("#FF9900");
        polygon.setFillOpacity(0.2);
    }

    public Area getArea() {
        return area;
    }

    public void setArea(Area area) {
        this.area = area;
    }

    public Coordenada getCoordenada() {
        return coordenada;
    }

    public void setCoordenada(Coordenada coordenada) {
        this.coordenada = coordenada;
    }

    public List<Coordenada> getCoordenadas() {
        return coordenadas;
    }

    public void setCoordenadas(List<Coordenada> coordenadas) {
        this.coordenadas = coordenadas;
    }

    public Polygon getPolygon() {
        return polygon;
    }

    public void setPolygon(Polygon polygon) {
        this.polygon = polygon;
    }

    public LatLng getCoord() {
        return coord;
    }

    public void setCoord(LatLng coord) {
        this.coord = coord;
    }

    public DefaultMapModel getMapModel() {
        return mapModel;
    }

    public void setMapModel(DefaultMapModel mapModel) {
        this.mapModel = mapModel;
    }

    public Unidade getUnidade() {
        return unidadeEditar;
    }

    public void setUnidade(Unidade unidadeEditar) {
        this.unidadeEditar = unidadeEditar;
    }

    public boolean isDisableEnderecoImovel() {
        return disableEnderecoImovel;
    }

    public void setDisableEnderecoImovel(boolean disableEnderecoImovel) {
        this.disableEnderecoImovel = disableEnderecoImovel;
    }

    public boolean isMensagemCep() {
        return mensagemCep;
    }

    public void setMensagemCep(boolean mensagemCep) {
        this.mensagemCep = mensagemCep;
    }

    public Unidade getUnidadeEditar() {
        return unidadeEditar;
    }

    public void setUnidadeEditar(Unidade unidadeEditar) {
        this.unidadeEditar = unidadeEditar;
    }

    public Unidade getUnidadeVisualizar() {
        return unidadeVisualizar;
    }

    public void setUnidadeVisualizar(Unidade unidadeVisualizar) {
        this.unidadeVisualizar = unidadeVisualizar;
    }

    public String getEditarUnidade() {
        return editarUnidade;
    }

    public void setEditarUnidade(String editarUnidade) {
        this.editarUnidade = editarUnidade;
    }
}
